混合编程之 Matlab 调用 Fortran 您所在的位置:网站首页 simply fortran怎么运行程序 混合编程之 Matlab 调用 Fortran

混合编程之 Matlab 调用 Fortran

2024-07-09 16:49| 来源: 网络整理| 查看: 265

因为学习的需要,于是上网学习Fortran与Matlab之间的混编,起初模仿网上现成的代码,但总有碰壁,被各种小问题烦恼不堪,后慢慢摸索调试,总算能成功运行,写下此博文一为记录自己的心得,以备后用;二为网上被同样问题困扰之士提供可能的帮助。

一. 测试平台

Window 10 64位系统 Matlab 2017a 64位 Simply Fortran v2.4

二. Matlab 调用 Fortran 之 DLL实现

1、生成DLL文件 步骤1:在Simply Fortran v2.4上,新建一个Shared Library(DLL)项目,项目名随意。 步骤2:由于在64位的Matlab上调用DLL,因此我们须将项目的DLL文件也生成为64位,否则Matlab将会提示错误 “不是有效的Win32应用程序” 。注意Target Name的dll文件名须符合为Matlab变量命名法则。 另外,数值之间的传递须有相同的数值类型,否则将会运行出错。这里先提一句,我们生成的DLL文件可被调用,一般按C调用约定,因此,Fortran的数值类型须与C的数值类型匹配。在Fortran中常用的数据参数类型有: REAL:表示浮点数据类型,即小数,等价于C的float; INTEGER:表示整数类型,相当于C的int数据类型; DOUBLE PRECISION:表示双精度数据类型,相当于C的double数据类型。 在本例中,我们均采用double数据类型,为了方便,可如下设置: 这里写图片描述 步骤3:书写DLL代码

subroutine test(c,a,b) !经过本人试验,输出变量必须位于输入变量之前,即c须位于a,b之前,否则在后续Matlab调用中会错误 !DEC$ ATTRIBUTES C,DLLEXPORT::test !上一行伪注释语句说明的是test_f.dll文件中包含一个名为test的子例行程序,C即为按C调用约定输出 real::a,b,c c=a+b end subroutine

步骤4:生成DLL 直接Build project,即可生成test_f.dll文件

2、书写C语言的头文件 C语言的头文件仅包含一句代码:void test(double*,double*,double*); 该代码名须与子例行程序名相同,该头文件可在任何文件编辑器中编写,编写完后保存头文件,本例中头文件名为:test_c.h。其实,每一个dll文件可包含多个子例行程序,那么在书写头文件代码时,就需要对应书写多个void代码。

3、编辑m文件 先附示例代码:

a=1;b=2;c=0; a=double(a);b=double(b);c=double(c); loadlibrary('test_f.dll','test_c.h'); w=calllib('test_f','test',c,a,b); unloadlibrary test_f

代码第一行,a,b为输入参数,c为输出参数,但须赋初值,如0; 代码第二行,将各参数转为类型相同的double类型参数; 代码第三行,加载动态链接库,前一个为动态链接库文件名,后一个为头文件名,两者均须加后缀; 代码第四行,调用动态链接库,前一个为动态链接库文件名,无后缀,后一个为想调用的子例行程序名; 代码第五行,释放动态链接库,为无后缀的动态链接库文件名。

由此,Matlab 调用 Fortran 之 DLL成功实现。

可以预知,该例所求值:w=3; 若上述第四行代码改为:

[w,m]=calllib('test_f','test',c,a,b);

则输出的是:w=3;m=1;对应的是c和a的值。由此可见Matlab是按左到右的方式获取数值的,因此,参数的排列用户需要格外重视。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有